<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-tools-gcc-pass2" role="wrap">
  <?dbhtml filename="gcc-pass2.html"?>

  <sect1info condition="script">
    <productname>gcc-pass2</productname>
    <productnumber>&gcc-version;</productnumber>
    <address>&gcc-url;</address>
  </sect1info>

  <title>GCC-&gcc-version; - Проход 2</title>

  <indexterm zone="ch-tools-gcc-pass2">
    <primary sortas="a-GCC">GCC</primary>
    <secondary>tools, pass 2</secondary>
  </indexterm>

  <sect2 role="package">
    <title/>

    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
    href="../chapter06/gcc.xml"
    xpointer="xpointer(/sect1/sect2[1]/para[1])"/>

    <segmentedlist>
      <segtitle>&buildtime;</segtitle>
      <segtitle>&diskspace;</segtitle>

      <seglistitem>
        <seg>&gcc-ch5p2-sbu;</seg>
        <seg>&gcc-ch5p2-du;</seg>
      </seglistitem>
    </segmentedlist>

  </sect2>

  <sect2 role="installation">
    <title>Установка пакета GCC</title>

    <para>В первом проходе сборки GCC были установлены некоторые внутренние заголовочные файлы. Обычно некоторые из них, например -  <filename>limits.h</filename>, будет включен в систему как заголовочный файл <filename>limits.h</filename>, в нашем случае в каталог <filename>/tools/include/limits.h</filename>. Однако в первом проходе сборки файл <filename>/tools/include/limits.h</filename> не существует, таким образом внутренний заголовочный файл установленный GCC является частичным, автономный файл и не содержит функции системного заголовочного файла. Этого  достаточно, для выполнения сборки временной библиотеки libc, но теперь, пакету GCC необходимы все внутренние заголовочные файлы. Создание полной версии внутренних заголовочных файлов используя идентичную команду, при которой система сборки GCC работает при обычных обстоятельствах:</para>

<screen><userinput remap="pre">cat gcc/limitx.h gcc/glimits.h gcc/limity.h &gt; \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h</userinput></screen>
<!--
    <para>For x86 machines, the limited number of registers is a bottleneck
    for the system.  Free one up by not using a frame pointer that is not
    needed:</para>

<screen><userinput remap="pre">case `uname -m` in
  i?86) sed -i 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in ;;
esac</userinput></screen>
-->
    <para>Снова, изменим местоположение динамического компоновщика пакета GCC  по умолчанию используя тот, который установлен в каталоге<filename
    class="directory">/tools</filename>.</para>

<screen><userinput remap="pre">for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
      -e 's@/usr@/tools@g' $file.orig &gt; $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
  touch $file.orig
done</userinput></screen>
		<para>Для хост-системы x86_64 устанавливаем каталогом по умолчанию наименование 64-битных библиотек в <quote>lib</quote>:</para>

<screen><userinput remap="pre">case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac</userinput></screen>

    <para>Также, как и в первом проходе сборки GCC необходимы пакеты GMP, MPFR и MPC. распакуйте архивы с исходными кодами этих пакетов и переместите их требуемые каталоги:</para>

<screen><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
mv -v mpfr-&mpfr-version; mpfr
tar -xf ../gmp-&gmp-version;.tar.xz
mv -v gmp-&gmp-version; gmp
tar -xf ../mpc-&mpc-version;.tar.gz
mv -v mpc-&mpc-version; mpc</userinput></screen>
<!--
    <para>As in the first build of GCC, fix a problem identified upstream:</para>

<screen><userinput remap="pre">sed -i 's/if \((code.*))\)/if (\1 \&amp;\&amp; \!DEBUG_INSN_P (insn))/' gcc/sched-deps.c</userinput></screen>
-->
    <para>Создайте снова отдельный каталог для сборки:</para>

<screen><userinput remap="pre">mkdir -v build
cd       build</userinput></screen>

    <para>Перед началом сборки GCC, не забудьте очистить все переменные окружения, которые переопределяют аргументы и флаги для оптимизации.</para>

    <para>Подготовьте пакет GCC к компиляции:</para>

<screen><userinput remap="configure">CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../configure                                       \
    --prefix=/tools                                \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --enable-languages=c,c++                       \
    --disable-libstdcxx-pch                        \
    --disable-multilib                             \
    --disable-bootstrap                            \
    --disable-libgomp</userinput></screen>

    <variablelist>
      <title>Значения новых параметров конфигурации:</title>

      <varlistentry>
        <term><parameter>--enable-languages=c,c++</parameter></term>
        <listitem>
          <para>Этот аргумент гарантирует, что будут собраны оба компилятора C и C ++. </para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-libstdcxx-pch</parameter></term>
        <listitem>
          <para>Не выполнят сборку предварительно скомпилированых заголовочных файлов (PCH) для <filename class="libraryfile">libstdc++</filename>. Они занимают много места, и их использование не предусмотрено.</para>
        </listitem>
      </varlistentry>

      <varlistentry>
        <term><parameter>--disable-bootstrap</parameter></term>
        <listitem>
          <para>Для нативной сборки пакета GCC по умолчанию используется механизм сборки bootstrap. Он не просто компилирует GCC, а выполняет компиляцию в несколько проходов. Он использует программы, скомпилированые в первом проходе, чтобы выполнить повторную компиляцию на втором проходе, и затем снова в третий раз. Результат компиляции второго и третьего прохода сравниваются чтобы убедиться в безотказности. Также выполняется проверка на предмет корректности компиляции. Однако метод сборки LFS должен обеспечивать надежный компилятор
           без использования механизма сборки bootstrap каждый раз.</para>
        </listitem>
      </varlistentry>

    </variablelist>

    <para>Скомпилируйте пакет:</para>

<screen><userinput remap="make">make</userinput></screen>

    <para>Установите пакет:</para>

<screen><userinput remap="install">make install</userinput></screen>

    <para>После установки, необходимо создать символические ссылки. Многие программы и файлы сценариев запускают <command>cc</command> вместо <command>gcc</command>, для обеспечения переносимости на все UNIX системы.Не у всех установлен именно компилятор GNU C. Запуск cc позволяет администратору выбирать, какой компилятор C устанавливать в систему, и мы создаем ссылку на него:</para>
<screen><userinput remap="install">ln -sv gcc /tools/bin/cc</userinput></screen>

  <caution>
    <para>На этом этапе, необходимо остановиться, и проверить что базовый функционал (компиляция и линовка) созданных инструментов работает так, как необходимо. Чтобы выполнить проверку работоспособности, выполните следующие команды:</para>

<screen><userinput>echo 'int main(){}' &gt; dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'</userinput></screen>

    <para>Если все работает правильно, не должно быть ошибок, и вывод последней команды будет иметь вид:</para>

<screen><computeroutput>[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]</computeroutput></screen>

    <para>Обратите внимание, что для 32-битной машины, каталог динамического компоновщика будет <filename class="directory">/tools/lib/ld-linux.so.2</filename>.</para>

    <para>Если вывод не соответствует тому, как показано выше, или вообще вывода нет, значит,что-то не так. Изучите и повторите шаги выше, чтобы выяснить где проблема и устраните её. Важно, устранить проблему до того, как вы продолжите следующие шаги. Во-первых, повторите проверку работоспособности <command>gcc</command> вместо <command>cc</command>. Если все работает, тогда символическая ссылка <filename class="symlink">/tools/bin/cc</filename> отсутствует. Далее, убедитесь что переменная окружения <envar>PATH</envar> указана корректно. Это можно проверить, запустив команду <command>echo $PATH</command> и проверить что каталог <filename class="directory">/tools/bin</filename> находиться в начале списка. Если переменная окружения некорректная, это может означать, что вы авторизованы не как пользователь <systemitem class="username">lfs</systemitem> или что то пошло не так на более ранних этапах. Прочитайте внимательно главу <xref linkend="ch-tools-settingenviron"
    role="."/> ещё раз.</para>

    <para>Если всё в порядке, удалите тестовые файлы:</para>

<screen><userinput>rm -v dummy.c a.out</userinput></screen>

  </caution>

  </sect2>

  <sect2 role="content">
    <title/>

    <para>Подробная информация об этом пакете находится в
    <xref linkend="contents-gcc" role="."/></para>

  </sect2>

</sect1>
